package com.gqs.bookstore.web.servlet;

import java.io.IOException;
import java.sql.SQLException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import com.gqs.bookstore.service.UserService;
import com.gqs.bookstore.service.impl.UserServiceImpl;
import com.gqs.bookstore.util.Constants;
import com.gqs.bookstore.util.StringIsBlank;
import com.gqs.bookstore.vo.Users;

@SuppressWarnings("serial")
@WebServlet("/regist.do")
public class RegistServlet extends BaseServlet {
	protected void registForm(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException, SQLException {
		
		//do_regist.jsp里用到的：
//		 (1)用requerst而不用session是因为其符合业务逻辑【想在浏览器不关的情况下，只在请求一次中有效，则用request,而不必在一次会话中的所有页面都有效】
//		 (2)用请求转发是因为重定向[response.sendRedirect()]不能共享传递错误信息[因为重定向产生了2个request对象，前一个request对象
//			保存着错误信息，但返回来时自动消亡，后一个request对象当然没有保存错误信息]
//			而请求转发可以共享传递错误信息[弥补request的不足]
//		不足之处:在do_regist.jsp里除了验证其是否为空，还要验证输入的合法性，这就要用到js了;这里我仅仅验证其输入是否为空

		//在baseservlet里定义过了
//		request.setCharacterEncoding("UTF-8");
//		response.setCharacterEncoding("UTF-8");
//		response.setContentType("text/html;charset=utf-8");//servlet中必须添加的
		
		String nikename=request.getParameter("nikename");
		String account = request.getParameter("account");
		String password = request.getParameter("password");
		String passwordConfirm = request.getParameter("passwordConfirm");
		String phone = request.getParameter("phone");
		
		HttpSession session = request.getSession();
		String code=request.getParameter("inputPassword");//图片验证码
		//这是第三方jar包做的事【验证图片验证码】
		String realCode=(String)(session.getAttribute("KAPTCHA_SESSION_KEY"));
		
		Boolean isError = false;
		//5个if里是错误信息----//以下都将   [ 错误信息 ]   保存在request里
		if(StringIsBlank.isBlank(nikename)){
			//request.setAttribute("nikename", "用户名不能为空");//这里nikename只是个键名，可以随便起，后面的key值才是最重要的
			session.setAttribute("nikename", "用户名不能为空");
			isError=true;
		}
		if(StringIsBlank.isBlank(account)){
			//request.setAttribute("account", "账号不能为空");
			session.setAttribute("account", "账号不能为空");
			isError=true;
		}
		if(StringIsBlank.isBlank(password) || StringIsBlank.isBlank(passwordConfirm)){
			//request.setAttribute("password", "密码和确认密码不能为空");
			session.setAttribute("password", "密码和确认密码不能为空");
			isError=true;
		}
		if(!StringIsBlank.isBlank(password) && !password.equals(passwordConfirm)){
			//request.setAttribute("passwordConfirm", "两次密码不一致");
			session.setAttribute("passwordConfirm", "两次密码不一致");
			isError=true;
		}
		if(StringIsBlank.isBlank(phone)){
			//request.setAttribute("phone", "电话不能为空");
			session.setAttribute("phone", "电话不能为空");
			isError=true;
		}
		
		if(StringIsBlank.isBlank(code)){
			//request.setAttribute("code", "验证码不能为空");
			session.setAttribute("code", "验证码不能为空");
			isError=true;
		}
		
		if(!realCode.equals(code)){
			//request.setAttribute("code", "验证码输入有误");
			session.setAttribute("code", "验证码输入有误");
			isError=true;
		}
		
		if(isError){//出错了才返回去
			//response.sendRedirect("regist.jsp");重定向不能讲错误信息带回去
			//这里用到请求转发，将错误信息能带回去[只有请求转发能做到，实质上是服务器的内部跳转；地址栏也不用改变]
			
			//注意这块上面的所有的往request里传东西的都要改成session，因为这块重定向时request把数据丢失了
			response.sendRedirect("regist.do?m=showRegistForm");
			return;//这里return很重要，车老师好像也讲过，如果不写return的话，这里请求转发后会继续执行下面的代码，[请求转发和jspforward指令
            //还是有区别的]
		}else{//不出错则代表注册成功，返回到登陆界面
			Users users = new Users(nikename,account,password,phone);
			UserService userService = new UserServiceImpl();
			userService.regist(users);
			response.sendRedirect("login.do?m=showLogin");//保存用户的逻辑[注册成功后跳转到登录页面，地址栏要改变]
		}
		
	}
	
	protected void showRegistForm(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		RequestDispatcher requDis = request.getRequestDispatcher(Constants.JSP_PATH+"regist.jsp");
		requDis.forward(request, response);
	}
}
